home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / rsynth / src / phtoelm.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  2KB  |  124 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #if defined (__STDC__)
  4. #include <stdarg.h>
  5. #else
  6. #include <varargs.h>
  7. #endif
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <memory.h>
  11. #include "proto.h"
  12. #include "elements.h"
  13. #include "darray.h"
  14. #include "trie.h"
  15. #include "phtoelm.h"
  16. #include "holmes.h"
  17.  
  18. trie_ptr phtoelm = NULL;
  19.  
  20. static Elm_ptr find_elm PROTO((char *s));
  21.  
  22. static Elm_ptr find_elm(s)
  23. char *s;
  24. {
  25.  Elm_ptr e = Elements;
  26.    while (e < Elements + num_Elements)
  27.     {
  28.      if (!strcmp(s,e->name))
  29.       {
  30.        return e;
  31.       }
  32.      e++;
  33.     }
  34.  return NULL;
  35. }
  36.  
  37. #if defined (__STDC__)
  38. static void enter (char *p,...)
  39. #else
  40. static void enter(p,va_alist)
  41. char *p;
  42. va_dcl
  43. #endif
  44. {
  45.  va_list ap;
  46.  char *s;
  47.  char buf[20];
  48.  char *x = buf+1;
  49. #if defined(__STDC__)
  50.  va_start(ap,p);
  51. #else
  52.  va_start(ap);
  53. #endif
  54.  while ( (s = va_arg(ap,char *)))
  55.   {Elm_ptr e = find_elm(s);
  56.    if (e)
  57.     *x++ = (e - Elements);
  58.    else
  59.     {
  60.      fprintf(stderr,"Cannot find %s\n",s);
  61.     }
  62.   }
  63.  va_end(ap);
  64.  buf[0] = (x-buf)-1;
  65.  x = malloc(buf[0]+1);
  66.  memcpy(x,buf,buf[0]+1);
  67.  trie_insert(&phtoelm,p,x);
  68. }
  69.  
  70. static void enter_phonemes PROTO((void))
  71. {
  72. #include "phtoelm.def"
  73. }
  74.  
  75. void
  76. phone_append(p, ch)
  77. darray_ptr p;
  78. int ch;
  79. {
  80.  char *s = (char *) darray_find(p, p->items);
  81.  *s = ch;
  82. }
  83.  
  84. unsigned
  85. phone_to_elm(phone, n, elm)
  86. char *phone;
  87. int n;
  88. darray_ptr elm;
  89. {
  90.  char *s = phone;
  91.  unsigned t = 0;
  92.  char *limit = s + n;
  93.  if (!phtoelm)
  94.   enter_phonemes();
  95.  while (s < limit && *s)
  96.   {char *e = trie_lookup(&phtoelm,&s);
  97.    if (e)
  98.     {int n = *e++;
  99.      while (n-- > 0)
  100.       {int x = *e++;
  101.        t += Elements[x].du * speed;
  102.        phone_append(elm, x);
  103.       }
  104.     }
  105.    else
  106.     {char ch = *s++;
  107.      switch (ch)
  108.       {
  109.        case '\'':              /* Primary stress */
  110.        case ',':               /* Secondary stress */
  111.        case '+':               /* Stress of some kind */
  112.        case '-':               /* hyphen in input */
  113.         break;
  114.        default:
  115.         fprintf(stderr, "Ignoring %c in '%.*s'\n", ch, n, phone);
  116.         break;
  117.       }
  118.     }
  119.   }
  120.  return t;
  121. }
  122.  
  123.  
  124.